/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package AST;

import java.util.Hashtable;
import java.util.LinkedList;

/**
 *
 * @author Eddy
 */
public class TablaDeSimbolos {
     Hashtable <String,Simbolo>Tabla;
     Hashtable <String,Simbolo>Figura;
     Hashtable <String,Simbolo>Alteracion;
     
     LinkedList <String> Instrumento;
     int D,N;
     
     public TablaDeSimbolos()
     {
         Tabla=new Hashtable();
         Figura=new Hashtable();
         Alteracion=new Hashtable();
         
         Instrumento=new LinkedList();
         
         Compas=1;
         D=4;
         N=4;
     }
     
     public int Tempo;
     public String Clave;
     public boolean Do=false;
     public boolean Re=false;
     public boolean Fa=false;
     public boolean Sol=false;
     
     public float Compas;
     
     
     public boolean BuscarInstrumento(String in)
     {
         boolean res=false;
         int  i;
         for(i=0;i<Instrumento.size()&&!res;i++)
         {
             if(Instrumento.get(i).equals(in)){res=true;}
         }
         return res;
     }
     
     public boolean  InsertarTCompas(int n,int d)
     {
         boolean res=true;
         N=n;
         D=d;
         float n1=4;
         float d1=4;
         Compas=1;
         
             //Verificar el Compas Aqui???
         if(N==2||N==4||N==6||N==3||N==9)
         {       
            if(D==4||D==2||D==8)
            {
                n1=N;
                d1=D;
                Compas=n1/d1;
            }
            else{
                res=false;
                Errores.InsertarError(0, 0, "Denominador del compas Invalido  "+Integer.toString(D));
            }
         }
         else
         {
            res=false;
            Errores.InsertarError(0, 0, "Numerador  del compas Invalido  "+Integer.toString(N));  
         }
         return res;
     }
     
     public void PreCargarFigura()
     {
         Simbolo temp;
         
         temp=new Simbolo();
         temp.Nombre="REDONDA";
         temp.Sintetico="REDONDA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="BLANCA";
         temp.Sintetico="BLANCA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="NEGRA";
         temp.Sintetico="NEGRA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="CORCHEA";
         temp.Sintetico="CORCHEA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="SEMICORCHEA";
         temp.Sintetico="SEMICORCHEA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
     
     
     }
     
     public void Figura()
     {
         Simbolo temp;
         
         temp=new Simbolo();
         temp.Nombre="REDONDA";
         temp.Sintetico="REDONDA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="BLANCA";
         temp.Sintetico="BLANCA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="NEGRA";
         temp.Sintetico="NEGRA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="CORCHEA";
         temp.Sintetico="CORCHEA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="SEMICORCHEA";
         temp.Sintetico="SEMICORCHEA";
         temp.Figura=true;
         
         this.Figura.put(temp.Nombre, temp);
         
     
     
     }
     
     
     public Simbolo BuscarFiguraReal(Simbolo S)
     {
         boolean res=true;
         Simbolo res1=null;
         int i;
         for(i=0;i<this.Figura.size()&&res;i++)
         {         
             if(((Simbolo)(Figura.values().toArray()[i])).Nombre.equals(S.Nombre))
             {
                 
                 
                 res=false;
                 res1=(Simbolo)(Figura.values().toArray()[i]);
             }
         }
         return res1;
     }
     
     public boolean InsertarFigura(String nombreReal,String nombreSintetico,boolean AS)
     {
         boolean res=true;
         Simbolo s=new Simbolo();
         if(BuscarFigura(nombreSintetico)==null)
         {
             /*if(BuscarFigura(nombreReal)!=null)
             {
                 this.Figura.remove(nombreReal);
             }*/
             
             s.Figura=true;
             s.Nombre=nombreReal;
             s.Nombre.toUpperCase().equals(res);
             if(s.Nombre.toUpperCase().equals("REDONDA")){s.Tipo=1;s.Tipol="w";}
             if(s.Nombre.toUpperCase().equals("BLANCA")){s.Tipo=2;s.Tipol="h";}
             if(s.Nombre.toUpperCase().equals("NEGRA")){s.Tipo=4;s.Tipol="q";}
             if(s.Nombre.toUpperCase().equals("CORCHEA")){s.Tipo=8;s.Tipol="i";}
             if(s.Nombre.toUpperCase().equals("SEMICORCHEA")){s.Tipo=16;s.Tipol="s";}
             
             
             s.Silencio=false; //Silencio???
             Simbolo Sr=BuscarFiguraReal(s);
             if(Sr==null){
             
             this.Figura.put(nombreSintetico, s);
             }
             else
             {
                 res=false;
                 //error la figura de tipo Sr.NombreReal ya existe 
             }
         
         }else{
            res=false;
         }//Error: ya existe un alias para esta figura
         return res;
     }
     
     public Simbolo BuscarFigura(String nombreSintetico)
     {
         Simbolo s=null;
         s=this.Figura.get(nombreSintetico);
         return s;
     }
     
     public void PreCargarNotas()
     {
         Simbolo temp;
         
        
         
         temp=new Simbolo();
         temp.Nombre="DO";
         temp.Tipo=1;
         
         Tabla.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="RE";
         temp.Tipo=2;
         
         Tabla.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="MI";
         temp.Tipo=3;
         
         Tabla.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="FA";
         temp.Tipo=4;
         
         Tabla.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="SOL";
         temp.Tipo=5;
         
         Tabla.put(temp.Nombre, temp);
         
         temp=new Simbolo();
         temp.Nombre="LA";
         temp.Tipo=6;
         
         Tabla.put(temp.Nombre, temp);
        
         temp=new Simbolo();
         temp.Nombre="SI";
         temp.Tipo=7;
  
         Tabla.put(temp.Nombre, temp);
     
     
     
     }
     public Simbolo BuscarNotaReal(Simbolo S)
     {
         boolean res=true;
         Simbolo res1=null;
         Simbolo temp=null;
         int i;
         for(i=0;i<this.Tabla.size()&&res;i++)
         {         
             temp=(Simbolo)(Tabla.values().toArray()[i]);
             if(temp.Nombre.equals(S.Nombre)&&temp.Mayor==S.Mayor&&temp.Menor==S.Menor)
             {
                 res=false;
                 res1=(Simbolo)(Tabla.values().toArray()[i]);
             }
         }
         return res1;
     }
     
     
     
                                  //Tipo                Nombre 
     public boolean InsertarNota(String nombreReal,String nombreSintetico,boolean M,boolean Me)
     {
           boolean res=true;
           Simbolo s=new Simbolo();
           if(BuscarNota(nombreSintetico)==null)
           {
            /*if(Buscar(nombreReal)!=null)
            {    
               Tabla.remove(nombreReal);
            }*/
           s.Nombre=nombreReal;
           s.Sintetico=nombreSintetico;
           //notas Do,Re,Mi,Fa,Sol.....
           s.Silencio=false;
           if(nombreReal.equals("DO")){s.Tipo=1; s.Tipol="C";}
           if(nombreReal.equals("RE")){s.Tipo=2; s.Tipol="D";}
           if(nombreReal.equals("MI")){s.Tipo=3; s.Tipol="E";}
           if(nombreReal.equals("FA")){s.Tipo=4; s.Tipol="F";}
           if(nombreReal.equals("SOL")){s.Tipo=5; s.Tipol="G";}
           if(nombreReal.equals("LA")){s.Tipo=6; s.Tipol="A";}
           if(nombreReal.equals("SI")){s.Tipo=7; s.Tipol="B";}
           if(nombreReal.equals("AS")){s.Tipo=0; s.Tipol="R";s.Silencio=true;}
           
           s.Nota=true;
           s.Mayor=M;
           s.Menor=Me;
           Simbolo Sr=BuscarNotaReal(s);
           if(Sr==null)
           {
            this.Tabla.put(nombreSintetico, s);
           }
           else
           {
               res=false;
               //Error ya existe ese tipo de Nota pero con otro nombre Sr.NombreSintetico
           }
           
           }
           else
           {
            res=false;
           } //Error ya Existe una nota  con ese nombre(Alias)
           return res;
     }
     
     public Simbolo BuscarNota(String Sintentico)
     {
         Simbolo res=null;
         res=this.Tabla.get(Sintentico);
         return res;
     }
     
     public Simbolo BuscarAlteracionReal(Simbolo S)
     {
        boolean res=true;
         Simbolo res1=null;
         Simbolo temp=null;
         int i;
         for(i=0;i<this.Alteracion.size()&&res;i++)
         {         
             temp=(Simbolo)(Alteracion.values().toArray()[i]);
             if(temp.Nombre.equals(S.Alteracion))
             {
                 res=false;
                 res1=(Simbolo)(Alteracion.values().toArray()[i]);
             }
         }
         return res1;
     }
     
     public boolean InsertarAlteracion(String Nombre,String Sintentico)
     {
         boolean res=true;
         Simbolo s=new Simbolo();
         Simbolo Sr=null;
         s.Nombre=Nombre;
         s.Sintetico=Sintentico;
         s.Alteracion=true;
         if(BuscarAletracion(Sintentico)==null)
         {
             Sr=BuscarAlteracionReal(s);
             if(Sr==null)
             {
                 Alteracion.put(Sintentico, s);
                 res=true;
             }
             else
             {
                 res=false;
                 //Error: ya se declaro ese tipo de alteracion Sr.Nombre Sr.Sintentico
             }
             
         }
         else
         {
             res=false;
             //Error : ya existe una alteracion con ese nombre
         }
         return res;     
     }
     
     public Simbolo BuscarAletracion(String Sintentico)
     {
         Simbolo res=null;
         res=this.Alteracion.get(Sintentico);
         return res;
     }
     
    public TablaDeSimbolos tablaArriba;
}
